import Food from './food';
import ScorePanel from './ScorePanel';
import Snake from './snake';
class GameCtrol{
    snake:Snake;
    food:Food;
    scorePanel:ScorePanel;
    direction:string='';
    //游戏是否结束，true开始，false已结束
    isLive=true;
    constructor(){
        this.snake=new Snake();
        this.food=new Food();
        this.scorePanel=new ScorePanel(10,2);
        this.init();
    }
    //游戏的初始化
    init(){
        //绑定键盘按键按下的事件
        document.addEventListener('keydown',this.keydownHandler.bind(this));
        //调用run方法，使蛇移动
        this.run();
    }
    keydownHandler(event:KeyboardEvent){
        this.direction=event.key;
    }
    run(){
        let X=this.snake.X;
        let Y=this.snake.Y;
        switch(this.direction){
            //向上移动，top值减少
            case "ArrowUp":
                Y-=10;
                break;
            //向下移动，top值增加
            case "ArrowDown":
                Y+=10;
                break;
            //向左移动，left值减少
            case "ArrowLeft":
                X-=10;
                break;
            //向右移动，left值增加
            case "ArrowRight":
                X+=10;
                break;
        }
        // 检查是否吃到了食物
        this.checkEat(X,Y);
        try {
            this.snake.X=X;
            this.snake.Y=Y; 
        } catch (error) {
            //进入到catch，说明出现了异常，游戏结束，弹出一个提示信息
           alert(error.message+'游戏结束！'); 
           //将isLive设置为false
           this.isLive=false;
        }
        this.isLive && setTimeout(this.run.bind(this),300-(this.scorePanel.level-1)*30);
    }
    //定义一个方法，用来检查蛇是否吃到了食物
    checkEat(X:number,Y:number){
        //返回boolean值，两个坐标都一样，证明吃到了食物
        if(X===this.food.X && Y===this.food.Y){
            //吃到食物后食物的位置要进行重置
            this.food.change();
            //加分
            this.scorePanel.addScore();
            //身体加长
            this.snake.addBody();
        }
    }
}
export default GameCtrol;